package com.songxh.core.utils;

import com.songxh.core.entity.UserContext;

/**
 * 登录工具
 * @author songxh
 * @create 2022-12-29-15:59
 */
public class LoginUtils {
    //当前登录的用户
    private static ThreadLocal<UserContext> userContextThreadLocal = new ThreadLocal<>();

    //token
    private static ThreadLocal<String> token = new ThreadLocal();

    public static void setToken(String accessToken){
        token.set(accessToken);
    }

    public static String getToken(){
        return token.get();
    }

    public static void put(UserContext userContext){
        userContextThreadLocal.set(userContext);
    }

    public static UserContext get(){
        return userContextThreadLocal.get();
    }


    /**
     * 清除token和用户信息
     *
     * ThreadLocalMap 中使用的 key 为 ThreadLocal 的弱引用，而 value 是强引用。
     * 所以，如果 ThreadLocal 没有被外部强引用的情况下，在垃圾回收的时候，key 会被清理掉，而 value 不会被清理掉。
     * 这样一来，ThreadLocalMap 中就会出现 key 为 null 的 Entry。
     * 假如我们不做任何措施的话，value 永远无法被 GC 回收，这个时候就可能会产生内存泄露。
     * ThreadLocalMap 实现中已经考虑了这种情况，在调用 set()、get()、remove() 方法的时候，会清理掉 key 为 null 的记录。
     * 使用完 ThreadLocal方法后 最好手动调用remove()方法
     */
    public static void clearUserInfo(){
        token.remove();
        userContextThreadLocal.remove();
    }

}
